"use strict";

/* iterable */
var a = [1, 2, 3];
for (var x of a) {
    console.log(x);
}
// 1    2   3

var a = ['A', 'B', 'C'];
var s = new Set(['A', 'B', 'C']);
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
for (var x of a) { // 遍历Array
    console.log(x);
}
for (var x of s) { // 遍历Set
    console.log(x);
}
for (var x of m) { // 遍历Map
    console.log(x[0] + '=' + x[1]);
}

var a = ['A', 'B', 'C'];
a.name = "Hello";

for (var x in a) {
    console.log(x); // '0', '1', '2', 'name'
    // 不包含 length 属性
}

for (var x of a) {
    console.log(x); // 'A', 'B', 'C'
}

// Array
a.forEach(function (value, index, array) {
    // value: 指向当前元素的值
    // index: 指向当前索引
    // array: 指向 Array 对象本身
    console.log(value + ', index = ', + index);
});
// A, index = 0
// B, index = 1
// C, index = 2

// Set
s.forEach(function (value, value2, set) {
    // Set 没有索引，所以回调寒素的前两个参数都是元素本身
    console.log("value:", value + ',', "value2:", value2);
    // 如果 value 是数字形式，则 value + ',' 这种写法会把这个表达式强制转换为字符串
});
// value: 1, value2: 1
// value: 2, value2: 2
// value: 3, value2: 3

// Map
m.forEach(function (value, key, map) {
    console.log("key: " + key + ", " + "value = " + value);
});
// key: 1, value = x
// key: 2, value = y
// key: 3, value = z

a.forEach(function (value, index) {
    // 不需要 value 和 array 时，仍要写 value
    console.log(index);
});